package cn.yotta.user.web.autoconfiguration.provider.impl;

import cn.yotta.user.web.autoconfiguration.context.user.UserContext;
import cn.yotta.user.web.autoconfiguration.provider.LoginUser;
import cn.yotta.user.web.autoconfiguration.provider.TenantResolveProvider;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.ServletRequest;
import java.util.Objects;

import static cn.yotta.user.web.autoconfiguration.error.TenantErrorCode.USER_NOT_BIND_TENANT;

/**
 * @author wyaoyao
 * @date 2023/3/13 12:46
 * 默认从登录上下文中获取登录信息
 */
@Slf4j
public class DefaultTenantResolveProvider implements TenantResolveProvider {

    private static final Long ADMIN_ID = 1L;

    /**
     * TODO：目前实现比较乱
     * 租户id解析出为Null的两层含义：
     * 1. 表示接口不需要租户信息，比如用户登录，就不需要租户数据，只有登录之后，方能解析出用户的租户信息
     * 2. 平台管理员，可以访问所有租户数据
     */
    @Override
    public Long loadTenantId(ServletRequest request) throws TenantNotResolveException {
        // 获取登录用户
        final LoginUser loginUser = UserContext.get();
        // 用户不是null（说明已经登录），并且不是平台用户，就必须从用户信息中解析出租户信息
        if (Objects.nonNull(loginUser) && !resolveUserIsPlatAdmin(loginUser)) {
            return resolveTenantId(request, loginUser);
        }
        // 用户未登录或者是平台用户，返回null
        return null;
    }

    protected Long resolveTenantId(ServletRequest request, LoginUser loginUser) throws TenantNotResolveException {
        Long tenantId = loginUser.getTenantId();
        if (Objects.isNull(tenantId)) {
            // 除非是平台用户，必须能够解析出用户的租户信息
            throw new TenantNotResolveException(USER_NOT_BIND_TENANT.getCode());
        }
        return tenantId;
    }

    protected Boolean resolveUserIsPlatAdmin(LoginUser loginUser) {
        // 当前用户id为1的，就是平台管理员，拥有最大权限
        return ADMIN_ID.equals(loginUser.getId());
    }
}
